package model

import (
	"fmt"
	"os"

	"gitee.com/liumou_site/gf"
)

// InitConfig 初始化配置文件 config.toml，根据 Info 结构体中的字段生成配置文件内容。
// 如果配置文件不存在，则创建配置文件并写入配置内容；如果 Init 标志为 true，则强制重新写入配置内容。
// 该函数不返回任何值，但在执行过程中如果遇到错误，会记录错误日志并退出程序。
func (i Info) InitConfig() {
	// 创建文件对象，指向配置文件路径
	f := gf.NewFile("/etc/ssh-guardian/config.toml")
	f.IsFile()
	if i.Debug {
		GetLanguageManager().Info("正在初始化配置文件: ", "Initializing configuration file: ", f.FileName)
	}
	// 如果配置文件不存在，则创建配置文件并写入配置内容
	if !f.IsFiles {
		GetLanguageManager().Warn("配置文件不存在，创建配置文件: ", "The config.toml file does not exist, create it: ", f.FileName)
		// 创建配置文件所在目录
		i.Cmd.RunShell("mkdir", "-p", "/etc/ssh-guardian")
		if i.Cmd.Err != nil {
			GetLanguageManager().Error("创建配置文件目录失败: ", "Failed to create config.toml directory: ", i.Cmd.Err)
			os.Exit(1)
		}
		// 创建配置文件
		i.Cmd.RunShell("touch", "/etc/ssh-guardian/config.toml")
		if i.Cmd.Err != nil {
			GetLanguageManager().Error("创建配置文件失败: ", "Failed to create config.toml file: ", i.Cmd.Err)
			os.Exit(1)
		}
		// 写入配置内容到文件
		configContent := i.GenConf()
		f.Echo(configContent)
		if f.Err != nil {
			GetLanguageManager().Error("写入配置文件失败: ", "Failed to write config.toml file: ", f.Err)
			os.Exit(1)
		}
		f.Close()

		// 输出配置文件内容到屏幕
		GetLanguageManager().Info("创建配置文件成功，配置文件内容如下:", "Create config.toml file successfully, configuration content:")
		fmt.Println("\n=== 配置文件内容 ===")
		fmt.Println(configContent)
		fmt.Println("===================")
		return
	} else {
		GetLanguageManager().Info("配置文件已存在，跳过创建配置文件", "The config.toml file already exists, skip creating it: ", f.FileName)
	}

	// 如果 Init 标志为 true，则强制重新写入配置内容
	if i.Init {
		GetLanguageManager().Info("配置文件已存在，强制重写配置文件", "The config.toml file already exists, force rewrite it: ", f.FileName)
		configContent := i.GenConf()
		f.Echo(configContent)
		f.Close()
		i.Init = false

		// 输出重写后的配置文件内容到屏幕
		GetLanguageManager().Info("重写配置文件成功，新的配置文件内容如下:", "Rewrite config.toml file successfully, new configuration content:")
		fmt.Println("\n=== 重写后的配置文件内容 ===")
		fmt.Println(configContent)
		fmt.Println("=========================")
	}
}
